﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Iudicium.Archivos.CRN
{

    /// <summary>
    /// Summary description for ArchivoCRN
    /// </summary>
    public class ArchivoCRN
    {
        public ArchivoCRN()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public static int InsertarArchivo(Archivo objArchivo)
        {
            if (objArchivo == null)
            {
                throw new ArgumentException("El objecto Archivo no puede ser nulo");
            }
            if (string.IsNullOrEmpty(objArchivo.Nombre))
            {
                throw new ArgumentException("El nombre del archivo no puede ser nulo o vacio");
            }
            if (string.IsNullOrEmpty(objArchivo.RutaAlmacenamiento))
            {
                throw new ArgumentException("La ruta de almacenamiento del archivo no puede ser nulo o vacio");
            }
            if (string.IsNullOrEmpty(objArchivo.Extension))
            {
                throw new ArgumentException("La extension del archivo no puede ser nulo o vacio");
            }
            int? archivoId = 0;
            ArchivoDSTableAdapters.ArchivoTableAdapter adapter = new ArchivoDSTableAdapters.ArchivoTableAdapter();
            adapter.Insert(ref archivoId, objArchivo.Nombre, objArchivo.Extension, objArchivo.FechaCreacion, objArchivo.RutaAlmacenamiento);

            if (archivoId == null || archivoId.Value == 0)
            {
                throw new Exception("Ocurrio un error al generar el id del archivo");
            }
            return archivoId.Value;
        }

        public static Archivo GetArchivoById(int archivoId)
        {
            if (archivoId <= 0)
            {
                throw new ArgumentException("El id del archivo no puede ser menor o igual que cero.");
            }

            ArchivoDSTableAdapters.ArchivoTableAdapter adapter = new ArchivoDSTableAdapters.ArchivoTableAdapter();
            ArchivoDS.ArchivoDataTable tabla = adapter.GetArchivoById(archivoId);

            if(tabla == null || tabla.Rows.Count != 1)
            {
                throw new Exception("El resultado de la consulta obtuvo resultados inesperados");
            }

            ArchivoDS.ArchivoRow row = tabla[0];
            Archivo objArchivo = new Archivo(row.archivoId, row.nombre, row.extension, row.rutaAlmacenamiento, row.fechaCreacion, row.temp);
            return objArchivo;
        }

        public static List<RelacionArchivo> GetArchivosByObjeto(int objetoId, TipoRelacionArchivo tipoRelacion)
        {
            if (objetoId <= 0)
            {
                throw new ArgumentException("El id del objeto no puede ser menor o igual que cero.");
            }

            ArchivoDSTableAdapters.RelacionArchivoTableAdapter adapter = new ArchivoDSTableAdapters.RelacionArchivoTableAdapter();
            ArchivoDS.RelacionArchivoDataTable table = adapter.GetArchivosByObjeto(objetoId, tipoRelacion.ToString());

            if (table == null)
            {
                throw new Exception("Los resultados de la consulta fueron nulos");
            }
            List<RelacionArchivo> lista = new List<RelacionArchivo>();
            foreach (ArchivoDS.RelacionArchivoRow row in table)
            {
                TipoRelacionArchivo tipo = TipoRelacionArchivo.General;
                try 
	            {	        
		            tipo = (TipoRelacionArchivo)Enum.Parse(typeof(TipoRelacionArchivo), row.tipoId,true);
	            }
	            catch (Exception)
	            {
		              
	            }
                RelacionArchivo obj = new RelacionArchivo(row.relacionArchivoId, row.nombre, row.archivoId, row.objetoId, tipo, row.servicioId);
                lista.Add(obj);
            }
            return lista;
        }

        public static string EliminarArchivo(int archivoId)
        {
            if (archivoId <= 0)
            {
                throw new ArgumentException("El id del archivo no puede ser menor o igual que cero.");
            }

            string path = "";
            ArchivoDSTableAdapters.ArchivoTableAdapter adapter = new ArchivoDSTableAdapters.ArchivoTableAdapter();
            adapter.Delete(archivoId, ref path);

            return path;
        }

        public static void InsertarRelacionArchivo(List<int> archivos, int objetoId, TipoRelacionArchivo tipoRelacion, int servicioId)
        {
            if (archivos == null || archivos.Count == 0)
            {
                throw new ArgumentException("La lista de archivos no puede ser nula o vacia");
            }
            if (objetoId <= 0)
            {
                throw new ArgumentException("objeto id no puede ser menor o igual que cero");
            }
            if (servicioId <= 0)
            {
                throw new ArgumentException("servicio id no puede ser menor o igual que cero");
            }
            string ids = "";
            if (archivos.Count > 0)
                ids = archivos[0].ToString();
            for (int i = 1; i < archivos.Count; i++)
            {
                ids += "," + archivos[i];
            }

            ArchivoDSTableAdapters.RelacionArchivoTableAdapter adapter = new ArchivoDSTableAdapters.RelacionArchivoTableAdapter();
            adapter.Insert(ids, objetoId, tipoRelacion.ToString(), servicioId);
        }
    }
}